// 我们正在玩一个猜数字游戏。 游戏规则如下：
// 我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。
// 每次你猜错了，我会告诉你这个数字是大了还是小了。
// 你调用一个预先定义好的接口 guess(int num)，它会返回 3 个可能的结果（-1，1 或 0）：

// -1 : 我的数字比较小
//  1 : 我的数字比较大
//  0 : 恭喜！你猜对了！
// 示例 :

// 输入: n = 10, pick = 6
// 输出: 6

// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);

// 二分查找
class Solution {
public:
    int guessNumber(int n) {
        int left{1};
        int right{n};
        while (left < right) {
            int mid = left + (right - left) / 2;
            int res = guess(mid);
            if (res == 0) return mid;
            else if (res == -1) right = mid;
            else left = mid + 1;
        }
        return left;
    }
};

/* 二分查找
*/
class Solution {
public:
    int guessNumber(int n) {
        int left{1};
        int right{n};
        while (left < right) {
            int mid = left + (right - left) / 2;
            int res = guess(mid);
            if (res == 0) { // 猜对了
                return mid;
            } else if (res == -1) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

/* 三分查找
*/
class Solution {
public:
    int guessNumber(int n) {
        int low{1};
        int high{n};
        while (low <= high) {
            int mid1 = low + (high - low) / 3;
            int mid2 = high - (high - low) / 3;
            int res1 = guess(mid1);
            int res2 = guess(mid2);
            if (res1 == 0) {
                return mid1;
            } else if (res2 == 0) {
                return mid2;
            } else if (res1 < 0) {
                high = mid1 - 1;
            } else if (res2 > 0) {
                low = mid2 + 1;
            } else {
                low = mid1 + 1;
                high = mid2 - 1;
            }
        }
        return -1;
    }
};
